-
Notifications
You must be signed in to change notification settings - Fork 126
Add MongoDB Assistant Tools #472
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR introduces MongoDB Assistant tools for the MCP server, enabling natural language search and knowledge source discovery. It adds integration with the MongoDB Assistant AI chatbot and search service.
- Scaffolds a new
AssistantToolBase
class for MongoDB Assistant tool interactions - Implements two initial tools:
list_knowledge_sources
andsearch_knowledge
- Adds comprehensive test coverage with mocked API responses
Reviewed Changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.
Show a summary per file
File | Description |
---|---|
src/common/config.ts | Adds assistantBaseUrl configuration option |
src/tools/tool.ts | Extends ToolCategory type to include "assistant" |
src/tools/assistant/assistantTool.ts | Base class for Assistant tools with common functionality |
src/tools/assistant/list_knowledge_sources.ts | Tool for listing available knowledge sources |
src/tools/assistant/search_knowledge.ts | Tool for searching the knowledge base |
src/tools/assistant/tools.ts | Exports array of Assistant tools |
src/server.ts | Registers Assistant tools with the server |
tests/integration/helpers.ts | Updates response element types to support metadata |
tests/integration/tools/assistant/assistantHelpers.ts | Test utilities for Assistant tool testing |
tests/integration/tools/assistant/listKnowledgeSources.test.ts | Integration tests for list knowledge sources tool |
tests/integration/tools/assistant/searchKnowledge.test.ts | Integration tests for search knowledge tool |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
src/tools/assistant/assistantTool.ts
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we try to use the apiClient
to make this call? do you need specific headers or can you leverage that to make requests? Check getIpInfo
in that file for a customized call
Also, is this page not authenticated?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like the apiClient
is specifically for talking to Atlas/MMS APIs? The knowledge APIs are a distinct server so I don't think it will work for this.
do you need specific headers
Yeah we must include, at minimum, a user-agent
+ origin
or x-request-origin
header
is this page not authenticated
correct - the knowledge API is not authenticated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we instead return content
instead of throwing an exception? we've been changing this across the code. it's better to have the tool return a response but with the proper messaging
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes! Updated for both assistant tools.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
since we're here, can we also update the readme.md? there we call out all the tool categories
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we abstract this and move it to the base tool? Essentially, expose a function like:
protected function fetchKnowledgeBase<T>(method: "GET" | "POST", path: string, body?: unknown): Promise<T>
that calls fetch, parses the response, logs errors, etc. Additionally, we tend to prefer working with pure typescript types rather than zod schemas for API calls. Those are easier to reason about and more succinct to type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good call on moving the API call up one level of abstraction - done.
I don't follow the "no zod on API calls" logic. A network boundary is exactly where validation libraries like Zod are most useful - otherwise I have to assert the type (unsafe) or roll my own validation (clunkier than zod).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right - the main thing here is that we're in control of the API, so a simple type assertion is reasonable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well probably not how I'd handle it but also not my repo! Updated to remove the zod parse (and corresponding tests that check if we handle a malformed response) and replaced it with a vanilla assertion.
(Note - using as
instead of :
assertion to be more explicit that this is escape hatching. Both are equivalent since response.json()
returns Promise<any>
.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We shouldn't use Node.js fetch, but customFetch configured like in the Atlas Client:
mongodb-mcp-server/src/common/atlas/apiClient.ts
Lines 41 to 47 in 04a5ddc
The reason is that the customFetch supports enterprise proxies, which are relevant for customers with specific security requirements.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should convert this into a string, similar to what we do in:
mongodb-mcp-server/src/tools/mongodb/read/find.ts
Lines 93 to 103 in 04a5ddc
And also we should consider the information in the knowledge list untrusted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here, convert to string and treat it as untrusted data. We have a function for this:
https://github.com/mongodb-js/mongodb-mcp-server/blob/main/src/tools/tool.ts#L293
Proposed changes
(EAI-1266) Knowledge Search on MCP
Adds a new class of
Assistant
tools for interacting with the MongoDB Assistant (AI Chatbot + Search).This PR scaffolds the generic
AssistantToolBase
class as well as two initial tools:list_knowledge_sources
- pulls a list of all available data sources. Useful for knowing what data is available and for filtering thesearch_knowledge
search_knowledge
- runs a natural language search against the MongoDB Assistant knowledge base. Returns content chunks for the most relevant results.Checklist